{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import time\n",
    "import matplotlib.pyplot as plt\n",
    "import torch\n",
    "import torch.optim as optim\n",
    "import torch.distributions as td\n",
    "\n",
    "\n",
    "import multiprocessing\n",
    "\n",
    "def euler_position_to_T(euler_zyx,pos=None):\n",
    "    \n",
    "    n=euler_zyx.shape[1]\n",
    "    \n",
    "    if pos==None:\n",
    "        p=torch.zeros([3,n])\n",
    "    else:\n",
    "        p=pos\n",
    "    \n",
    "    angle_z=euler_zyx[0,:]\n",
    "    angle_y=euler_zyx[1,:]\n",
    "    angle_x=euler_zyx[2,:]\n",
    "    \n",
    "    cos_x, sin_x = torch.cos(angle_x), torch.sin(angle_x)\n",
    "    cos_y, sin_y = torch.cos(angle_y), torch.sin(angle_y)\n",
    "    cos_z, sin_z = torch.cos(angle_z), torch.sin(angle_z)\n",
    "\n",
    "    # Compute the elements of the rotation matrix\n",
    "    R00 = cos_z * cos_y\n",
    "    R01 = cos_z * sin_y * sin_x - sin_z * cos_x\n",
    "    R02 = cos_z * sin_y * cos_x + sin_z * sin_x\n",
    "    R10 = sin_z * cos_y\n",
    "    R11 = sin_z * sin_y * sin_x + cos_z * cos_x\n",
    "    R12 = sin_z * sin_y * cos_x - cos_z * sin_x\n",
    "    R20 = -sin_y\n",
    "    R21 = cos_y * sin_x\n",
    "    R22 = cos_y * cos_x\n",
    "    T_0 = torch.zeros(n)\n",
    "    T_1 = torch.ones(n)\n",
    "\n",
    "    # Construct the rotation matrix R from the elements\n",
    "    transformationT = torch.stack([torch.stack([R00, R01, R02,p[0,:]]),\n",
    "                                   torch.stack([R10, R11, R12,p[1,:]]),\n",
    "                                   torch.stack([R20, R21, R22,p[2,:]]),\n",
    "                                   torch.stack([T_0, T_0, T_0,T_1])])\n",
    "    \n",
    "    T=torch.transpose(transformationT,0,2)\n",
    "    T=torch.transpose(T,1,2)\n",
    "    \n",
    "    return T\n",
    "\n",
    "\n",
    "def multi_dot(M,n):\n",
    "    # 扩展A为大小为n的三维张量\n",
    "    batch_M = M.unsqueeze(0).expand(n, -1, -1)\n",
    "\n",
    "    # 计算n个A的点积\n",
    "    result = torch.bmm(batch_M, batch_M.transpose(1, 2))\n",
    "    \n",
    "    return result\n",
    "\n",
    "\n",
    "def xyz_to_rangebearing(v):\n",
    "\n",
    "    v_norm=torch.sqrt(torch.sum(v*v,axis=0))\n",
    "    unit_x=v*0.\n",
    "    unit_x[0,:]=1\n",
    "\n",
    "    v_normalized=v/(v_norm.repeat(3,1))\n",
    "\n",
    "    cos_bear=torch.sum(unit_x*v_normalized,axis=0)\n",
    "    bear=torch.acos(cos_bear)\n",
    "    \n",
    "\n",
    "    return v_norm,bear\n",
    "\n",
    "def vectors_to_euler_zy(v):\n",
    "    v_norm=torch.sqrt(torch.sum(v*v,axis=0))\n",
    "    v_normalized=v/(v_norm.repeat(3,1))\n",
    "    \n",
    "    r11=v_normalized[0,:]\n",
    "    r21=v_normalized[1,:]\n",
    "    r31=v_normalized[2,:]\n",
    "    \n",
    "    angle_z=torch.atan2(r21,r11)\n",
    "    angle_y=torch.atan2(-r31,torch.sqrt(r11**2+r21**2+1e-6))\n",
    "    \n",
    "    euler_zy=torch.vstack([angle_z,angle_y])\n",
    "    \n",
    "    return euler_zy\n",
    "\n",
    "\n",
    "def calculate_visibility(a,fov,bearing):\n",
    "    a_vis=torch.tensor(a)\n",
    "    #fov=torch.pi\n",
    "    v=1/(1+torch.exp(-a_vis*torch.cos(bearing*torch.pi/fov)))#*(1+torch.exp(-torch.tensor(a_vis)))\n",
    "    v_max=1/(1+torch.exp(-a_vis))\n",
    "    v_min=1/(1+torch.exp(a_vis))\n",
    "    \n",
    "    v_normalized=(v-v_min)/(v_max-v_min)\n",
    "    return v_normalized\n",
    "\n",
    "def pc_W_to_C(pc_W,T_W_C):\n",
    "    n_horizon=T_W_C.shape[0]\n",
    "    pc_size=pc_W.shape[1]\n",
    "    pc_W_aug=torch.vstack([pc_W,torch.ones(pc_size)])\n",
    "    pc_W_aug=pc_W_aug.repeat(n_horizon,1,1)\n",
    "    pc_C_aug=T_W_C@pc_W_aug\n",
    "    pc_C=pc_C_aug[:,:3,:]\n",
    "    \n",
    "    return pc_C\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.float32\n",
      "torch.float32\n",
      "tensor(-1.8860, grad_fn=<SubBackward0>)\n",
      "0.03286004066467285\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_34528/114501878.py:94: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
      "  a_vis=torch.tensor(a)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAksAAAGdCAYAAAACMjetAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABV+ElEQVR4nO3deVxU5f4H8M8MMAPDOIPAsAmiaIGamitC5pJctLyae3vi1UzDSjFTWmz7mZXacr2WlYV6bTFKC7NrqaClYio5lqaouKAIuCCDgDAwc35/wBwdQQRk5szg5/16nddlZp455zvHed359JznPI9MEAQBRERERFQrudQFEBERETkyhiUiIiKiOjAsEREREdWBYYmIiIioDgxLRERERHVgWCIiIiKqA8MSERERUR0YloiIiIjq4Cp1Ac7MbDbjzJkzaNGiBWQymdTlEBERUT0IgoBLly4hKCgIcvmN+40Ylm7CmTNnEBISInUZRERE1AinTp1CcHDwDdsxLN2EFi1aAKg62RqNRuJqiIiIqD6KiooQEhIi/o7fCMPSTbBcetNoNAxLRERETqa+Q2g4wJuIiIioDgxLRERERHVgWCIiIiKqA8MSERERUR0YloiIiIjqwLBEREREVAeGJSIiIqI6MCwRERER1YFhiYiIiKgODEtEREREdWBYIiIiIqoDwxIRERFRHbiQrgP6LuM0/jxdiPs6ByIyzEfqcoiIiG5p7FlyQFsOn8OK9JPYf6ZI6lKIiIhueQxLDshT4QIAKC2vlLgSIiIiYlhyQJ7KqqujxUaGJSIiIqkxLDmgKz1LJokrISIiIoYlB2TpWSphzxIREZHkGJYckMoSljhmiYiISHIMSw5Iray+DGfkZTgiIiKpMSw5IJWieoA3e5aIiIgkx7DkgNTVl+E4wJuIiEh6DEsOSFV9Nxx7loiIiKTHsOSALHfDlfJuOCIiIskxLDkgceoAXoYjIiKSHMOSA7JMSmk0mWGsNEtcDRER0a2NYckBWe6GA3gpjoiISGoMSw5I4SqHwqXqn6aEcy0RERFJimHJQXlaJqbkHXFERESSYlhyUJyYkoiIyDEwLDkocWJKXoYjIiKSFMOSg1IpOTElERGRI2BYclBqTkxJRETkEBiWHNSVJU94GY6IiEhKDEsOSlzyhJfhiIiIJMWw5KA8FZYlTxiWiIiIpMSw5KAsA7w5KSUREZG0bBaW5s2bh+joaKhUKnh5edXrPcXFxZg2bRqCg4Ph4eGBjh07YunSpVZt8vLy8NhjjyEgIACenp7o3r07vvvuO/H1LVu2QCaT1brt3r0bAHDixIlaX9+5c2eTff6bpWbPEhERkUNwvXGTxjEajRg7diyioqLw2Wef1es9CQkJSE1NxapVq9CmTRv88ssveOqppxAUFIThw4cDAB5//HEUFhYiJSUFvr6++PLLLzFu3Djs2bMH3bp1Q3R0NHJzc632+/LLL2Pz5s3o2bOn1fObNm1Cp06dxMc+Pj43+ambjqp6zBJ7loiIiKRls56l1157DTNmzEDnzp3r/Z4dO3Zg/PjxGDBgANq0aYPJkyeja9eu2LVrl1Wbp59+Gr1790ZYWBheeukleHl5ISMjAwCgUCgQEBAgbj4+Pvjhhx8wYcIEyGQyq+P5+PhYtXVzc2uaD98E1FzuhIiIyCE41Jil6OhopKSkICcnB4IgIC0tDYcPH0ZsbKxVm9WrV6OgoABmsxlff/01ysrKMGDAgFr3mZKSggsXLmDChAk1Xhs+fDj8/PzQt29fpKSk3LC+8vJyFBUVWW22wuVOiIiIHINDhaXFixejY8eOCA4OhkKhwJAhQ7BkyRL069dPbPPNN9+goqICPj4+UCqVePLJJ7F27Vq0b9++1n1+9tlnGDx4MIKDg8Xn1Go1Fi1ahOTkZKxfvx59+/bFiBEjbhiY5s+fD61WK24hISFN88FrweVOiIiIHEODwtKcOXOuO3jash06dKjRxSxevBg7d+5ESkoKMjIysGjRIsTHx2PTpk1im5dffhmFhYXYtGkT9uzZg4SEBIwbNw5//fVXjf2dPn0aP//8MyZOnGj1vK+vLxISEhAZGYlevXrhrbfewqOPPooFCxbUWV9iYiIMBoO4nTp1qtGf9UYsk1JygDcREZG0GjTAe+bMmYiLi6uzTVhYWKMKuXz5Ml544QWsXbsWQ4cOBQB06dIFer0eCxcuRExMDLKysvCf//wH+/fvFwdmd+3aFb/99huWLFlS4865pKQk+Pj4iIPD6xIZGYmNGzfW2UapVEKpVDbq8zWUpzjAm2GJiIhISg0KSzqdDjqdziaFVFRUoKKiAnK5dWeXi4sLzGYzAKC0tBQA6mxjIQgCkpKS8Pjjj9dr4LZer0dgYODNfIQmJYYlLndCREQkKZtNHZCdnY2CggJkZ2fDZDJBr9cDANq3bw+1Wg0AiIiIwPz58zFy5EhoNBr0798fs2bNgoeHB0JDQ7F161asXLkS7777rti+ffv2ePLJJ7Fw4UL4+Pjg+++/x8aNG/Hjjz9aHT81NRXHjx/HpEmTatS2YsUKKBQKdOvWDQCwZs0afP7551i2bJmtTkeDeYqTUlZCEIQad/IRERGRfdgsLM2dOxcrVqwQH1uCSVpamnjnWmZmJgwGg9jm66+/RmJiIh555BEUFBQgNDQU8+bNw5QpUwAAbm5u+OmnnzBnzhwMGzYMxcXFaN++PVasWIH77rvP6vifffYZoqOjERERUWt9b7zxBk6ePAlXV1dERERg9erVGDNmTFOegptiWe5EEIDLFSbx7jgiIiKyL5kgCILURTiroqIiaLVaGAwGaDSaJt232Syg3Ys/QRCA3S/GQNfCPmOliIiImruG/n471NQBdIVcLoPKjXfEERERSY1hyYGpeEccERGR5BiWHJiad8QRERFJjmHJgYkTU7JniYiISDIMSw7MMtdSKXuWiIiIJMOw5MA8ueQJERGR5BiWHBiXPCEiIpIew5IDs0xMyZ4lIiIi6TAsObArPUscs0RERCQVhiUHJq4Px54lIiIiyTAsOTBPzrNEREQkOYYlB8a74YiIiKTHsOTAeDccERGR9BiWHJiKd8MRERFJjmHJgVkGeJfybjgiIiLJMCw5MF6GIyIikh7DkgO7Mikle5aIiIikwrDkwDjPEhERkfQYlhyYpWepvNKMSpNZ4mqIiIhuTQxLDswyZgngkidERERSYVhyYApXOdxcZAB4KY6IiEgqDEsOztK7VMo74oiIiCTBsOTgLOOWinlHHBERkSQYlhycODElL8MRERFJgmHJwanEniWGJSIiIikwLDk4tThmiZfhiIiIpMCw5OBUiuqJKTnAm4iISBIMSw5OXB+Ol+GIiIgkwbDk4K4secLLcERERFJgWHJwVxbTZc8SERGRFBiWHJx4GY4DvImIiCTBsOTgxAHe7FkiIiKSBMOSg1NzuRMiIiJJMSw5OJWSk1ISERFJiWHJwakty51wzBIREZEkbBaW5s2bh+joaKhUKnh5edXrPcXFxZg2bRqCg4Ph4eGBjh07YunSpVZtsrKyMHLkSOh0Omg0GowbNw75+flWbQoKCvDII49Ao9HAy8sLEydORHFxsVWbP//8E3fffTfc3d0REhKCd95556Y+r61wuRMiIiJp2SwsGY1GjB07FlOnTq33exISErBhwwasWrUKBw8exPTp0zFt2jSkpKQAAEpKShAbGwuZTIbU1FRs374dRqMRw4YNg9lsFvfzyCOP4MCBA9i4cSN+/PFH/Prrr5g8ebL4elFREWJjYxEaGoqMjAwsWLAAr776Kj755JOmOwFNRByzxHmWiIiIpCHYWFJSkqDVauvVtlOnTsLrr79u9Vz37t2FF198URAEQfj5558FuVwuGAwG8fXCwkJBJpMJGzduFARBEP7++28BgLB7926xzf/+9z9BJpMJOTk5giAIwocffii0bNlSKC8vF9vMnj1bCA8Pb9BnMxgMAgCreppa1tlLQujsH4U75m6w2TGIiIhuJQ39/XaoMUvR0dFISUlBTk4OBEFAWloaDh8+jNjYWABAeXk5ZDIZlEql+B53d3fI5XJs27YNAJCeng4vLy/07NlTbBMTEwO5XI7ff/9dbNOvXz8oFAqxzeDBg5GZmYmLFy9et77y8nIUFRVZbbamFudZqoQgCDY/HhEREVlzqLC0ePFidOzYEcHBwVAoFBgyZAiWLFmCfv36AQD69OkDT09PzJ49G6WlpSgpKcFzzz0Hk8mE3NxcAEBeXh78/Pys9uvq6gpvb2/k5eWJbfz9/a3aWB5b2tRm/vz50Gq14hYSEtJkn/16LHfDmQWgvNJ8g9ZERETU1BoUlubMmQOZTFbndujQoUYXs3jxYuzcuRMpKSnIyMjAokWLEB8fj02bNgEAdDodkpOTsW7dOqjVami1WhQWFqJ79+6Qy22f+xITE2EwGMTt1KlTNj+mys1F/JuDvImIiOzPtSGNZ86cibi4uDrbhIWFNaqQy5cv44UXXsDatWsxdOhQAECXLl2g1+uxcOFCxMTEAABiY2ORlZWF8+fPw9XVFV5eXggICBCPGxAQgLNnz1rtu7KyEgUFBQgICBDbXHsHneWxpU1tlEql1SVAe5DLZVApXFBqNFUN8lbb9fBERES3vAaFJZ1OB51OZ5NCKioqUFFRUaOHyMXFxepONwtfX18AQGpqKs6ePYvhw4cDAKKiolBYWIiMjAz06NFDbGM2mxEZGSm2efHFF1FRUQE3NzcAwMaNGxEeHo6WLVva5PPdDJXCFaVGE3uWiIiIJGCza1fZ2dnQ6/XIzs6GyWSCXq+HXq+3mu8oIiICa9euBQBoNBr0798fs2bNwpYtW3D8+HEsX74cK1euxMiRI8X3JCUlYefOncjKysKqVaswduxYzJgxA+Hh4QCADh06YMiQIXjiiSewa9cubN++HdOmTcODDz6IoKAgAMDDDz8MhUKBiRMn4sCBA1i9ejU++OADJCQk2Op03JQrE1MyLBEREdmdrW7LGz9+vACgxpaWlia2ASAkJSWJj3Nzc4W4uDghKChIcHd3F8LDw4VFixYJZrNZbDN79mzB399fcHNzE2677bYarwuCIFy4cEF46KGHBLVaLWg0GmHChAnCpUuXrNrs27dP6Nu3r6BUKoVWrVoJb731VoM/oz2mDhAEQbj3/V+F0Nk/CmmH8m16HCIioltBQ3+/ZYLA+9Ebq6ioCFqtFgaDARqNxmbHGbc0HbtOFODDR7rjvs6BNjsOERHRraChv98ONXUA1U5VfRmOY5aIiIjsj2HJCXiKS54wLBEREdkbw5IT8FRU9SyVGLk+HBERkb0xLDkBS89SCXuWiIiI7I5hyQl4Kqovw7FniYiIyO4YlpyApWeJA7yJiIjsj2HJCXhyUkoiIiLJMCw5AZXC0rPEy3BERET2xrDkBMTlTngZjoiIyO4YlpzAlZ4lhiUiIiJ7Y1hyAuKklLwbjoiIyO4YlpyAZYA351kiIiKyP4YlJ2CZZ6mEd8MRERHZHcOSE7BchiurMKPSZJa4GiIiolsLw5ITsFyGA4DSCo5bIiIisieGJSegcJHDVS4DAJRyriUiIiK7YlhyAjKZjEueEBERSYRhyUl4KrjkCRERkRQYlpwEe5aIiIikwbDkJFSWiSk5ZomIiMiuGJachOUyHOdaIiIisi+GJSdhuQxXwp4lIiIiu2JYchJizxLHLBEREdkVw5KTEHuWeBmOiIjIrhiWnMSVy3AMS0RERPbEsOQkriymyzFLRERE9sSw5CQs68OxZ4mIiMi+GJacBO+GIyIikgbDkpNQcbkTIiIiSTAsOQk1B3gTERFJgmHJSag4wJuIiEgSDEtOggO8iYiIpMGw5CQ4zxIREZE0GJacxNXzLAmCIHE1REREtw6bhaV58+YhOjoaKpUKXl5e9XpPcXExpk2bhuDgYHh4eKBjx45YunSpVZusrCyMHDkSOp0OGo0G48aNQ35+vvj6iRMnMHHiRLRt2xYeHh5o164dXnnlFRiNRqs2MpmsxrZz584m+ey2YLkMZzILKK80S1wNERHRrcNmYcloNGLs2LGYOnVqvd+TkJCADRs2YNWqVTh48CCmT5+OadOmISUlBQBQUlKC2NhYyGQypKamYvv27TAajRg2bBjM5qoAcejQIZjNZnz88cc4cOAA3nvvPSxduhQvvPBCjeNt2rQJubm54tajR4+m+fA2YBngDfBSHBERkT253rhJ47z22msAgOXLl9f7PTt27MD48eMxYMAAAMDkyZPx8ccfY9euXRg+fDi2b9+OEydOYO/evdBoNACAFStWoGXLlkhNTUVMTAyGDBmCIUOGiPsMCwtDZmYmPvroIyxcuNDqeD4+PggICLi5D2onLnIZPNxccLnChFKjCT5SF0RERHSLcKgxS9HR0UhJSUFOTg4EQUBaWhoOHz6M2NhYAEB5eTlkMhmUSqX4Hnd3d8jlcmzbtu26+zUYDPD29q7x/PDhw+Hn54e+ffuKvVeOzHIprpg9S0RERHbjUGFp8eLF6NixI4KDg6FQKDBkyBAsWbIE/fr1AwD06dMHnp6emD17NkpLS1FSUoLnnnsOJpMJubm5te7z6NGjWLx4MZ588knxObVajUWLFiE5ORnr169H3759MWLEiBsGpvLychQVFVlt9mS5I46zeBMREdlPg8LSnDlzah0YffV26NChRhezePFi7Ny5EykpKcjIyMCiRYsQHx+PTZs2AQB0Oh2Sk5Oxbt06qNVqaLVaFBYWonv37pDLa36UnJwcDBkyBGPHjsUTTzwhPu/r64uEhARERkaiV69eeOutt/Doo49iwYIFddY3f/58aLVacQsJCWn0Z20McWJKrg9HRERkNw0aszRz5kzExcXV2SYsLKxRhVy+fBkvvPAC1q5di6FDhwIAunTpAr1ej4ULFyImJgYAEBsbi6ysLJw/fx6urq7w8vJCQEBAjeOeOXMGAwcORHR0ND755JMbHj8yMhIbN26ss01iYiISEhLEx0VFRXYNTGpOTElERGR3DQpLOp0OOp3OJoVUVFSgoqKiRg+Ri4uLeKfb1Xx9fQEAqampOHv2LIYPHy6+lpOTg4EDB6JHjx5ISkqqtdfpWnq9HoGBgXW2USqVVuOl7I1LnhAREdmfze6Gy87ORkFBAbKzs2EymaDX6wEA7du3h1qtBgBERERg/vz5GDlyJDQaDfr3749Zs2bBw8MDoaGh2Lp1K1auXIl3331X3G9SUhI6dOgAnU6H9PR0PPvss5gxYwbCw8MBVAWlAQMGIDQ0FAsXLsS5c+fE91rufFuxYgUUCgW6desGAFizZg0+//xzLFu2zFano0lwMV0iIiL7s1lYmjt3LlasWCE+tgSTtLQ0cWqAzMxMGAwGsc3XX3+NxMREPPLIIygoKEBoaCjmzZuHKVOmiG0yMzORmJiIgoICtGnTBi+++CJmzJghvr5x40YcPXoUR48eRXBwsFVNV898/cYbb+DkyZNwdXVFREQEVq9ejTFjxjTpOWhqKkX1ZTgO8CYiIrIbmcC1MxqtqKgIWq0WBoNBnPfJll5NOYDlO04gfmA7zBocYfPjERERNUcN/f12qKkDqG6e4gBvjlkiIiKyF4YlJ3Jl6gBehiMiIrIXhiUnohYnpWTPEhERkb0wLDkRywBvLndCRERkPwxLTkTN5U6IiIjsjmHJiaiUXO6EiIjI3hiWnIi43Al7loiIiOyGYcmJcCFdIiIi+2NYciJc7oSIiMj+GJaciOVuuMsVJpjMnHidiIjIHhiWnIin8spSfrwjjoiIyD4YlpyI0lUOF7kMACemJCIisheGJScik8k4MSUREZGdMSw5GXFiSt4RR0REZBcMS06GPUtERET2xbDkZLjkCRERkX0xLDkZy8SU7FkiIiKyD4YlJ+Mp9ixxzBIREZE9MCw5GU/L+nDsWSIiIrILhiUn46nk+nBERET2xLDkZDyr74bjAG8iIiL7YFhyMpaeJQ7wJiIisg+GJSfjqeAAbyIiIntiWHIy7FkiIiKyL4YlJ2O5G45jloiIiOyDYcnJXJmUkpfhiIiI7IFhycmIPUu8DEdERGQXDEtOxjLAm5NSEhER2QfDkpMRJ6Xk3XBERER2wbDkZDjAm4iIyL4YlpyMpWepwiSgvJK9S0RERLbGsORkVG4u4t+lvCOOiIjI5hiWnIyrixzublX/bJyYkoiIyPYYlpwQlzwhIiKyH4YlJ8QlT4iIiOzHZmFp3rx5iI6OhkqlgpeXV73eU1xcjGnTpiE4OBgeHh7o2LEjli5datUmKysLI0eOhE6ng0ajwbhx45Cfn2/Vpk2bNpDJZFbbW2+9ZdXmzz//xN133w13d3eEhITgnXfeuanPa08qBe+IIyIishebhSWj0YixY8di6tSp9X5PQkICNmzYgFWrVuHgwYOYPn06pk2bhpSUFABASUkJYmNjIZPJkJqaiu3bt8NoNGLYsGEwm81W+3r99deRm5srbk8//bT4WlFREWJjYxEaGoqMjAwsWLAAr776Kj755JOm+fA2plZyYkoiIiJ7cbXVjl977TUAwPLly+v9nh07dmD8+PEYMGAAAGDy5Mn4+OOPsWvXLgwfPhzbt2/HiRMnsHfvXmg0GgDAihUr0LJlS6SmpiImJkbcV4sWLRAQEFDrcb744gsYjUZ8/vnnUCgU6NSpE/R6Pd59911Mnjy5cR/YjlRiWOKYJSIiIltzqDFL0dHRSElJQU5ODgRBQFpaGg4fPozY2FgAQHl5OWQyGZRKpfged3d3yOVybNu2zWpfb731Fnx8fNCtWzcsWLAAlZVXemHS09PRr18/KBQK8bnBgwcjMzMTFy9etPGnvHme1ZfhSngZjoiIyOZs1rPUGIsXL8bkyZMRHBwMV1dXyOVyfPrpp+jXrx8AoE+fPvD09MTs2bPx5ptvQhAEzJkzByaTCbm5ueJ+nnnmGXTv3h3e3t7YsWMHEhMTkZubi3fffRcAkJeXh7Zt21od29/fX3ytZcuWtdZXXl6O8vJy8XFRUVGTfv768mTPEhERkd00qGdpzpw5NQZOX7sdOnSo0cUsXrwYO3fuREpKCjIyMrBo0SLEx8dj06ZNAACdTofk5GSsW7cOarUaWq0WhYWF6N69O+TyKx8lISEBAwYMQJcuXTBlyhQsWrQIixcvtgo6jTF//nxotVpxCwkJuan9NZYnB3gTERHZTYN6lmbOnIm4uLg624SFhTWqkMuXL+OFF17A2rVrMXToUABAly5doNfrsXDhQnE8UmxsLLKysnD+/Hm4urrCy8sLAQEBdR43MjISlZWVOHHiBMLDwxEQEFDjDjrL4+uNcwKAxMREJCQkiI+LiookCUycOoCIiMh+GhSWdDoddDqdTQqpqKhARUWFVQ8RALi4uNS40w0AfH19AQCpqak4e/Yshg8fft196/V6yOVy+Pn5AQCioqLw4osvoqKiAm5ubgCAjRs3Ijw8/LqX4ABAqVRajZeSiiUscbkTIiIi27PZAO/s7Gzo9XpkZ2fDZDJBr9dDr9ejuLhYbBMREYG1a9cCADQaDfr3749Zs2Zhy5YtOH78OJYvX46VK1di5MiR4nuSkpKwc+dOZGVlYdWqVRg7dixmzJiB8PBwAFWDt99//33s27cPx44dwxdffIEZM2bg0UcfFYPQww8/DIVCgYkTJ+LAgQNYvXo1PvjgA6teI0dmuQxXzMtwREREtifYyPjx4wUANba0tDSxDQAhKSlJfJybmyvExcUJQUFBgru7uxAeHi4sWrRIMJvNYpvZs2cL/v7+gpubm3DbbbfVeD0jI0OIjIwUtFqt4O7uLnTo0EF48803hbKyMqv69u3bJ/Tt21dQKpVCq1athLfeeqvBn9FgMAgABIPB0OD33ozVu7OF0Nk/CnGf/27X4xIRETUHDf39lgmCIEgX1ZxbUVERtFotDAaDOO+TPfz0Vy6e+uIP9G7jjW+mRNntuERERM1BQ3+/HWqeJaofFedZIiIishuGJSfE5U6IiIjsh2HJCakU1WHJyLvhiIiIbI1hyQmxZ4mIiMh+GJackEppmcHbBLOZ4/OJiIhsiWHJCXkqrswlWlrBS3FERES2xLDkhNzd5JDLqv4u5aU4IiIim2JYckIymUzsXeIgbyIiIttiWHJSnhzkTUREZBcMS07KMsibYYmIiMi2GJaclDh9AGfxJiIisimGJSclLnlS3nzGLO3NvohBi7Zg7g/7cbHEKHU5REREABiWnFZzm5hSEAS8mnIAWedKsDL9JPovSMPn246jwmSWujQiIrrFMSw5qea25Ela5lnsO22Ah5sLIgJaoKisEq//+DeGvP8r0jLPSl0eERHdwhiWnFRzuhtOEAS8t/EIAODxqFCsf+ZuzBt5B7w9Fcg6V4IJSbsRl7QLR88WS1wpERHdihiWnJSnZcxSMxjgvengWfyVY4BK4YLJ/cLgIpfhkchQpD03AJP6toWrXIYtmecw5P1f8dq6AzCUVkhdMhER3UIYlpxUc+lZMpsFvLvxMAAgLroNfNRK8TWthxte+mdH/DKjHwZF+KHSLCBp+wkMWJiG/6afQCXHMxERkR0wLDkpT8tiuk5+N9wvf+fhYG4R1EpXPHF3WK1twnRqfBbXCyv/1Ru3+alxsbQCL/9wAEP/vQ3bjpy3c8VERHSrYVhyUlcGeDtvz5LZLOD9TVVjlSbc1QYtPRV1tu93uw7/e/ZuvDa8E7xUbsjMv4RHP/sdk1bswYnzJfYomYiIbkEMS07qytQBztuz9L/9eTiUdwktlK6Y1Lf2XqVrubrIMT66DbY8NwBx0W3gIpdh08F8/OO9rXjzp4MoKuN4JiIialoMS05K5eQDvE1mAe9vqhqr9K++baFVuTXo/V4qBV4d3gkbnr0b/W7XocIk4JNfj+He939DASe0JCKiJsSw5KScfVLK9X/l4sjZYmjcXfGvvm0bvZ/b/FtgxYRe+DyuJ4K07sgpvIyV6SearlAiIrrlMSw5KZUTX4a7uldp0t1h0Ho0rFfpWjKZDPdE+GPOfR0AACvTT6KswvnOCxEROSaGJSelVjrvZbiUfTk4dq4EWg83TLirTZPt9747AtDKywMFJUZ898fpJtsvERHd2hiWnJTlbjhnmzqg0mTGvzcfBQBM7heGFu4316t0NVcXuXhJb9lvx2E2C022byIiunUxLDkpy6SURpMZxkrnmZzxe/0ZHD9fgpYqN4yPbtPk+3+gVwg07q44fr4EGw/mN/n+iYjo1sOw5KQsy50AQKmTXIqrMJmxOLVqXqUn+7cTB6k3JbXSFY/0CQUAfPrrsSbfPxER3XoYlpyUq4scSteqf75iJ7kjbu0fOTh5oRQ+ngo8HhVqs+PERbeBm4sMe05eRMbJizY7DhER3RoYlpyY5VJcqdHxxy0ZK834d3Wv0pT+7cQxV7bgr3HHiDtbAQCW/cbeJSIiujkMS07Msj6cM8y19N0fp3H64mX4qpV4tI/tepUsnuhXNSP4hgN5XAqFiIhuCsOSE/NUOMdcS+WVJvwnteoOuKcGtIPHVeOtbOV2/xYYEK6DIACfbTtu8+MREVHzxbDkxJxlyZNv9pxGTuFl+LVQ4uHI1nY77uS7q3qXkjNOcQkUIiJqNIYlJ+bpBEuelFWY8GFaVa9S/MD2cHezfa+SRVQ7H9zRSoOyCjP+m37SbsclIqLmhWHJiYmX4Rx4gPfq3aeQayhDgMYdD/QKseuxZTIZnqjuXVqZfoJLoBARUaMwLDkxR+9ZKqsw4cMt1b1K99i3V8nivs6BaOXlgQslRqz5I8fuxyciIudns7A0b948REdHQ6VSwcvLq17vKS4uxrRp0xAcHAwPDw907NgRS5cutWqTlZWFkSNHQqfTQaPRYNy4ccjPvzJT85YtWyCTyWrddu/eDQA4ceJEra/v3LmzyT6/PVjuhit10LD05e/ZyC8qRysvD4zrGSxJDW5WS6Ac4xIoRETUYDYLS0ajEWPHjsXUqVPr/Z6EhARs2LABq1atwsGDBzF9+nRMmzYNKSkpAICSkhLExsZCJpMhNTUV27dvh9FoxLBhw2A2Vy35ER0djdzcXKtt0qRJaNu2LXr27Gl1vE2bNlm169GjR9OdADuw9CwVO+DdcJeNJny4JQtA1Vglpav9e5UsHugVghburjh2vgSbuAQKERE1kM1mBnzttdcAAMuXL6/3e3bs2IHx48djwIABAIDJkyfj448/xq5duzB8+HBs374dJ06cwN69e6HRaAAAK1asQMuWLZGamoqYmBgoFAoEBASI+6yoqMAPP/yAp59+GjKZzOp4Pj4+Vm2djWXJE0dc7uSL30/ifHE5glt6YEwPaXqVLNRKVzwSGYqlW7Pw6W/HENvJef/NiYjI/hxqzFJ0dDRSUlKQk5MDQRCQlpaGw4cPIzY2FgBQXl4OmUwGpVIpvsfd3R1yuRzbtm2rdZ8pKSm4cOECJkyYUOO14cOHw8/PD3379hV7r5zJlZ4lxwpLpcZKfFTdq/TMPbdB4Sr912zCXVVLoOw+cRF/ZHMJFCIiqj/pf8WusnjxYnTs2BHBwcFQKBQYMmQIlixZgn79+gEA+vTpA09PT8yePRulpaUoKSnBc889B5PJhNzc3Fr3+dlnn2Hw4MEIDr7Su6FWq7Fo0SIkJydj/fr16Nu3L0aMGHHDwFReXo6ioiKrTUqWu+EcbbmTlekncaHEiNbeKozs3krqcgBULYFyf/USKFxgl4iIGqJBYWnOnDnXHTxt2Q4dOtToYhYvXoydO3ciJSUFGRkZWLRoEeLj47Fp0yYAgE6nQ3JyMtatWwe1Wg2tVovCwkJ0794dcnnNj3L69Gn8/PPPmDhxotXzvr6+SEhIQGRkJHr16oW33noLjz76KBYsWFBnffPnz4dWqxW3kBD73gp/LUfsWSour8THW6t7lQbdBjcXx8njlmkENhzIw8kLXAKFiIjqp0FjlmbOnIm4uLg624SFhTWqkMuXL+OFF17A2rVrMXToUABAly5doNfrsXDhQsTExAAAYmNjkZWVhfPnz8PV1RVeXl4ICAio9bhJSUnw8fHB8OHDb3j8yMhIbNy4sc42iYmJSEhIEB8XFRVJGphUSscbs7RixwlcLK1AW19PjLgzSOpyrIQHtED/23XYevgcPtt2HK/ff4fUJRERkRNoUFjS6XTQ6XQ2KaSiogIVFRU1eohcXFzEO92u5uvrCwBITU3F2bNnawQiQRCQlJSExx9/HG5ubjc8vl6vR2BgYJ1tlEql1Xgpqamre5ZKHeRuuEqTGct+q7rE9cyg9nB1oF4liyf7hWHr4XP4Zs8pzIi5HS09FVKXREREDs5md8NlZ2ejoKAA2dnZMJlM0Ov1AID27dtDrVYDACIiIjB//nyMHDkSGo0G/fv3x6xZs+Dh4YHQ0FBs3boVK1euxLvvvivuNykpCR06dIBOp0N6ejqeffZZzJgxA+Hh4VbHT01NxfHjxzFp0qQata1YsQIKhQLdunUDAKxZswaff/45li1bZqOzYRuWteEc5TLc37lFuFhaAY27K4Z3dYyxSteKaueDTkEaHDhThP/uPIlnBt0mdUlEROTgbBaW5s6dixUrVoiPLcEkLS1NnBogMzMTBoNBbPP1118jMTERjzzyCAoKChAaGop58+ZhypQpYpvMzEwkJiaioKAAbdq0wYsvvogZM2bUOP5nn32G6OhoRERE1FrfG2+8gZMnT8LV1RURERFYvXo1xowZ0xQf3W4cbYD3ruMFAICebbzhIpfdoLU0ZDIZJvcLw7Nf67FixwlM7hcmycziRETkPGSCIHBK40YqKiqCVquFwWAQ532yp3OXytFr3ibIZMCxN++rMY+UvT353z34+UA+Zg+JwNQB7SStpS4VJjMGLNiCnMLLmD+qMx7q3VrqkoiIyI4a+vvteINKqN4sy50IAnBZ4kViBUHA7hNV8xf1bttS0lpuxM1Fjgl3tQEAfMolUIiI6AYYlpyYh5sLLJ1JUo9byjpXjIISI5SucnRu5SVpLfXxYO/WVUugnCvB5kNnpS6HiIgcGMOSE5PJZFfGLUl8R9yu41W9SneGeDnEjN03ola64uHIqstvnKSSiIjq4vi/alQny6U4qXuWdp+oGtzdu623pHU0xITotnBzkWHXiQLs5RIoRER0HQxLTs5R7oiz3AnXq43zhKUArbs4xcGnv7F3iYiIasew5OQsS56USNizdKbwMnIKL0MuA7qHOvbg7ms90a8tAGDDfi6BQkREtWNYcnKWiSlLJFzyxHIJrlOQVpxV3FlEBGjQ/3YdzALw+bbjUpdDREQOiGHJyTnCkifOeAnuapP7Va0r+M2e07hYYpS4GiIicjQMS05OVR2WpBzgfWVwt3NdgrOIbueDjoEaXK4wYUX6CanLISIiB8Ow5OQ8qy/DlUp0Ge5iiRGH84sBVC1z4oxkMhmmVM84viTtKP7gnXFERHQVhiUn5yn2LElzGW7PyapgEabzhK9aKUkNTWFYl0Dc1zkAFSYBT636A+eLy6UuiYiIHATDkpOTumdJvATnpL1KFjKZDO+M6Yp2Ok/kFZXh6S/3otJklrosIiJyAAxLTs5T4jFLzj64+2pqpSs+fqwHVAoXpB+7gIW/HJa6JCIicgAMS05OJeHdcKXGSuzPMQBwrpm769LerwXeGdMFALB0axY27M+TuCIiIpIaw5KTUyulm2dJn12ISrOAAI07glt62P34tvLPLkGY2Ldqssrnkvfh2LliiSsiIiIpMSw5OZVCuhm8d1WPV+rV1hsymczux7elOfdGoHcbbxSXV2LKqgzJxoQREZH0GJacnFpc7sT+l+GuDO52zvmV6uLmIsd/Hu4GXQslDucXY853f0EQBKnLIiIiCTAsOTmpljupMJnxx8lCAFU9S82Rn8YdHz7SHa5yGVL2ncHyHSekLomIiCTAsOTkxOVOjPbtWTpwpgiXK0zQerjhdr8Wdj22PfVq443E+zoAAOatP4g91b1pRER062BYcnJSLXeyu3rKgJ6hLSGXN6/xStf6111t8M8ugag0C3jqiz9w9lKZ1CUREZEdMSw5OXX1AG9jpRkVdpxE8erB3c2dTCbD26O74DY/Nc5eKse0L/fa9VwTEZG0GJacnEf1mCXAfnMtmc2CeDmqOUxGWR+eSlcsfawH1EpX7DpegHc2HJK6JCIishOGJSencJVD4VL1z2ivQd5Z54pxsbQC7m5ydG6ltcsxHUE7nRoLx1ZNWPnpb8fx01+5EldERET2wLDUDHhaJqa007glyyW4O0O8oHC9tb5CQ+4IxJP9wgAAs5L34ejZSxJXREREtnZr/dI1U+LElHa6I84yuNvZF89trFmDw9EnzBslRhOmrPpDsnX5iIjIPhiWmoErE1Pa50d794mLAG6Nwd21cXWRY/FD3eGvUeLo2WLM/vZPTlhJRNSMMSw1Ayo7XobLKbyMnMLLcJHL0L1185u5u750LZT48JEecHORYf1fufhs23GpSyIiIhthWGoGxJ4lOwzwtlyC6xSkgWf1cW9VPUJb4qWhHQEA8/93CL8fuyBxRUREZAsMS82AuOSJHaYO2HWLTRlwI49HhWLEnUEwmQXEf7kXuYbLUpdERERNjGGpGfC045glcXD3LTpe6VoymQxvjuqMiIAWOF9cjglJu3GprELqsoiIqAkxLDUDnna6G+5iiRFHzhYDYM/S1VQKV3z6eE/4qpU4lHcJT33xB2f4JiJqRhiWmgFLz1KpjXuWdldfgmvvp4a3p8Kmx3I2Id4qfB7XEx5uLvjtyHm8tHY/75AjImomGJaaAU/LmCUbD/DezfFKdeoS7IX/PNwNchmwes8pLEk7KnVJRETUBBiWmoErY5Zsexlulzhe6dadMuBGBnXwx2vDOwEAFv5yGN/vzZG4IiIiulkMS82APZY7KSmvxP4zRQDYs3Qjj0W1wWTLkijf7sNOTilAROTUbBqW5s2bh+joaKhUKnh5edXrPfn5+YiLi0NQUBBUKhWGDBmCI0eOWLUpKytDfHw8fHx8oFarMXr0aOTn51u1yc7OxtChQ6FSqeDn54dZs2ahstI6TGzZsgXdu3eHUqlE+/btsXz58pv5uJK5styJ7cLS3uxCmMwCgrTuCG6pstlxmos5QyJwX+cAVJgETF65h2vIERE5MZuGJaPRiLFjx2Lq1Kn1ai8IAkaMGIFjx47hhx9+wN69exEaGoqYmBiUlJSI7WbMmIF169YhOTkZW7duxZkzZzBq1CjxdZPJhKFDh8JoNGLHjh1YsWIFli9fjrlz54ptjh8/jqFDh2LgwIHQ6/WYPn06Jk2ahJ9//rnpToCdqO1wGU6cX4lTBtSLXC7Du+PuRPfWXigqq0Rc0m6cu1QudVlERNQYgh0kJSUJWq32hu0yMzMFAML+/fvF50wmk6DT6YRPP/1UEARBKCwsFNzc3ITk5GSxzcGDBwUAQnp6uiAIgvDTTz8JcrlcyMvLE9t89NFHgkajEcrLywVBEITnn39e6NSpk9XxH3jgAWHw4MH1/lwGg0EAIBgMhnq/xxZ2Zp0XQmf/KAxcmGazYzz4cboQOvtH4b/pJ2x2jOboQnG50P+dVCF09o/CsMW/CSXlFVKXRER0y2vo77dDjVkqL6/6L293d3fxOblcDqVSiW3btgEAMjIyUFFRgZiYGLFNREQEWrdujfT0dABAeno6OnfuDH9/f7HN4MGDUVRUhAMHDohtrt6HpY1lH9err6ioyGpzBLaelNJYacbeU1WL53Iyyobx9lRg+YTeaKlyw5+nDXjmq70wmTmlABGRM3GosGQJPYmJibh48SKMRiPefvttnD59Grm5uQCAvLw8KBSKGmOg/P39kZeXJ7a5OihZXre8VleboqIiXL5c+5IV8+fPh1arFbeQkJCb/sxN4co8S7a5DLf/jAFlFWZ4qdzQXqe2yTGasza+nlg2vicUrnJsOngWr687wDmYiIicSIPD0pw5cyCTyercDh061Khi3NzcsGbNGhw+fBje3t5QqVRIS0vDvffeC7lc+lyXmJgIg8EgbqdOnZK6JABX3Q1nrLTJj7BliZOeod6Qy2VNvv9bQY9Qb7w37k4AwIr0k/hs23FpCyIionpr8LLxM2fORFxcXJ1twsLCGlsPevToAb1eD4PBAKPRCJ1Oh8jISPTs2RMAEBAQAKPRiMLCQqvepfz8fAQEBIhtdu3aZbVfy91yV7e59g66/Px8aDQaeHh41FqbUqmEUqls9GezFctyJ2YBKKsww6N6ksqmYpmMkvMr3ZyhXQKRUxiBN386hHk/HUQrLw/c2zlQ6rKIiOgGGhyWdDoddDqdLWqxotVqAQBHjhzBnj178MYbbwCoClNubm7YvHkzRo8eDQDIzMxEdnY2oqKiAABRUVGYN28ezp49Cz8/PwDAxo0bodFo0LFjR7HNTz/9ZHXMjRs3ivtwJh5uLpDJAEGo6l1qyrBkNgvYfaJqvBLnV7p5T9wdhlMFl/HfnScxfbUefhp39AhlCCUicmQ2vbaVnZ0NvV6P7OxsmEwm6PV66PV6FBcXi20iIiKwdu1a8XFycjK2bNkiTh/wj3/8AyNGjEBsbCyAqhA1ceJEJCQkIC0tDRkZGZgwYQKioqLQp08fAEBsbCw6duyIxx57DPv27cPPP/+Ml156CfHx8WLP0JQpU3Ds2DE8//zzOHToED788EN88803mDFjhi1PiU3I5TKo3GwzMeWRs8UwXK6Ah5sL7milbdJ934pkMhleGdYRgyL8UF5pxhMr9+DE+ZIbv5GIiCRj07A0d+5cdOvWDa+88gqKi4vRrVs3dOvWDXv27BHbZGZmwmAwiI9zc3Px2GOPISIiAs888wwee+wxfPXVV1b7fe+99/DPf/4To0ePRr9+/RAQEIA1a9aIr7u4uODHH3+Ei4sLoqKi8Oijj+Lxxx/H66+/LrZp27Yt1q9fj40bN6Jr165YtGgRli1bhsGDB9vwjNiOrZY8scyv1K21F9xcpB831hy4usix+OFu6NxKi4ISIyYs342CEqPUZRER0XXIBN6W02hFRUXQarUwGAzQaDSS1jJw4RYcP1+C5ClRTXq57Jmv9iJl3xk8O+g2zPjH7U22XwLOXirDyCU7kFN4GT1DW2LVpEi4uzXteDMiIqqpob/f7CpoJmyxPpwgCFcN7uZ4pabm18IdSRN6oYW7K/acvIjpX+tRaTJLXRYREV2DYamZENeHa8LLcKcvXkauoQyuchm6tfZqsv3SFbf7t8DHj/WAwkWODQfyMH01AxMRkaNhWGomPBVX5lpqKpZepU6ttGIYo6YX3c4XHz3aHW4uMvz4Zy5mJu/jLN9ERA6EYamZsMWSJ+IluDa8td3WBnXwx5KHu8NVLsMP+jN4joGJiMhhMCw1E5aJKUuNTXcZblf1zN2cX8k+YjsF4D8Pd4OLXIa1e3Pw/Ld/wszAREQkOYalZsLSs1TcRD1LF4rLkXWuav4fhiX7GXJHIBY/VBWYvvvjNOasYWAiIpIaw1IzYbkbrrSJwpJl1u7b/NRo6alokn1S/dzXORDvP3An5DLgmz2n8eL3fzEwERFJiGGpmRDHLDXRZTjLeKVenDJAEsO6BuG96sD01a5TePmH/TZZJJmIiG6MYamZEO+Ga7KeJcvgboYlqdx/ZyssGtcVMhnwxe/ZeCXlAAMTEZEEGJaaiabsWSopr8SBM0UA2LMktZHdgrFgTFVgWpl+Eq+t+5uBiYjIzhiWmokrk1LefM/SH9kXYTILaOXlgVZeHje9P7o5Y3oE4+1RXQAAy3ecwP+tP8jARERkRwxLzYS6CedZ2i1OGcD5lRzFuF4hmD+qMwDgs23HMf9/hxiYiIjshGGpmVApm24G710c3O2QHurdGv834g4AwCe/HsPbGzIZmIiI7IBhqZmw9CyV3uTacMZKM/ZmFwLg4G5H9GifULx+fycAwNKtWVj0y2EGJiIiG2NYaiZU1XfD3eyklH/lGFBeaUZLlRva+6mbojRqYo9HtcGrwzoCAP6TdhTvbToicUVERM0bw1IzYVnupLzSfFOr1v9+/AKAqlm7ZTJZk9RGTS/urrZ4+Z9Vgenfm4/gAwYmIiKbYVhqJixTBwCNnz5AEASk6M8AAO6+zbdJ6iLbmdi3LV68rwMA4L1NhzH/fwc50zcRkQ0wLDUTClc53FyqeoJKGznI+8/TBhzKuwSFqxzDu7ZqyvLIRp7oF4YX7osAAHy89RhmJu+DsbLxPYtERFQTw1Iz4nmT0wd8vfsUAOC+OwKgVbk1WV1kW5P7tcOCMV3gIpdh7d4cTFyxu8kWVCYiIoalZsVTnJiy4ZfhSo2VWLev6hLcuF4hTVoX2d7YniH4bHxPqBQu+O3IeTz4STrOXiqTuiwiomaBYakZ8byJuZbW/5mL4vJKhPqo0KetT1OXRnYwINwPXz3RBz6eCuzPKcLoj3bg+PkSqcsiInJ6DEvNiOomepZWV1+CG9czBHI574JzVl1DvPDd1Gi09lbhVMFljP5oB/SnCqUui4jIqTEsNSPixJQN7Fk6evYS9py8CLmsah0ycm5tfD3x3dRodAnWoqDEiIc+2YnUQ/lSl0VE5LQYlpqRxk5M+c2e0wCAeyL84K9xb/K6yP50LZT46ok+6He7DpcrTHhiZQa+qe49JCKihmFYakYas+SJsdKM7zKqwtIDvVrbpC6ShqfSFZ+N74lR3VvBZBbw/Hd/YvHmI1wehYiogRiWmhHLYroN6VnafDAfF0qM0LVQYmC4zlalkUTcXORYNLYrnhrQDgCwaONhvPT9fpg4eSURUb0xLDUjno0Ys7R6T9WlmTE9guHqwq9DcySTyfD8kAi8NrwTZDLgi9+zMWVVBsoqbm7RZSKiWwV/HZsRyzxLxfW8DHem8DK2Hj4HoOouOGrexke3wYcPd4fCVY6Nf+fjkWW/o7DUKHVZREQOj2GpGbEM8K5vz1LyntMQBKBPmDfa+nrasjRyEPd2DsSqiZHQuLsi4+RFjP5oB05fLJW6LCIih8aw1IyoG7Dcidks4JvqS3APcMbuW0rvtt74dmo0ArXuyDpXglEf7sDfZ4qkLouIyGExLDUjKmX9J6XcnnUeOYWX0cLdFffeEWjr0sjB3O7fAt9Njcbt/mqcvVSO0R/twPd7c6Qui4jIITEsNSNqZf0vw1kWzR3ZrRXc3VxsWhc5piAvDyRPicZd7X1wucKE6av1eGHtXxz4TUR0DYalZkQlDvCuOywVlBix8UDVjM4c2H1r03q4YeW/IvHMPe0hkwFf/p6NMUt3IPsCxzEREVkwLDUjV5Y7qbtnYO3eHBhNZtzRSoM7WmntURo5MBe5DAmx4UiK64WWKjfszynC0MW/4ZcDeVKXRkTkEBiWmpH6LHciCAJW784GwBm7ydqAcD+sf+ZudG/thUtllZj83wy8+dNBVJjMUpdGRCQpm4alefPmITo6GiqVCl5eXvV6T35+PuLi4hAUFASVSoUhQ4bgyJEjVm3KysoQHx8PHx8fqNVqjB49Gvn5VxYK3bdvHx566CGEhITAw8MDHTp0wAcffGC1jy1btkAmk9XY8vKc97+mr+5Zut6SFvpThTicXwylqxzDuwbZszxyAkFeHvh6chT+dVdbAMAnvx7Dw5/uRJ6hTOLKiIikY9OwZDQaMXbsWEydOrVe7QVBwIgRI3Ds2DH88MMP2Lt3L0JDQxETE4OSkhKx3YwZM7Bu3TokJydj69atOHPmDEaNGiW+npGRAT8/P6xatQoHDhzAiy++iMTERPznP/+pcczMzEzk5uaKm5+f381/cIlY7oYzmQWUV9beG7C6emD30M6B0Hq42a02ch4KVznmDuuIjx7pjhZKV+w+cRFD//0bth05L3VpRESSkAl2WFVz+fLlmD59OgoLC+tsd/jwYYSHh2P//v3o1KkTAMBsNiMgIABvvvkmJk2aBIPBAJ1Ohy+//BJjxowBABw6dAgdOnRAeno6+vTpU+u+4+PjcfDgQaSmpgKo6lkaOHAgLl68WO9er2sVFRVBq9XCYDBAo9E0ah9NyWwWEPbCTwCAjJdi4KNWWr1eUl6J3vM2ocRowurJfRAZ5iNFmeRETpwvwdQv/sDB3CLIZMCzg27D0/fcBhe5TOrSiIgaraG/3w41Zqm8vBwA4O7uLj4nl8uhVCqxbds2AFW9RhUVFYiJiRHbREREoHXr1khPT7/uvg0GA7y9vWs8f+eddyIwMBD/+Mc/sH379hvWV1RUZLU5ErlcJo5bqm2upfV/5qLEaEJbX0/0blvzXBBdq42vJ9Y+FY0He4VAEID3Nx1BXNIuXCgul7o0IiK7caiwZAk9iYmJuHjxIoxGI95++22cPn0aubm5AIC8vDwoFIoavUH+/v7XHW+0Y8cOrF69GpMnTxafCwwMxNKlS/Hdd9/hu+++Q0hICAYMGIA//vjjuvXNnz8fWq1W3EJCHO+2e8tiuiW1zLX0dfXA7nE9QyCTsWeA6sfdzQVvje6ChWO7wt1Njt+OnMfQf29DxskCqUsjIrKLBoelOXPm1Dow+urt0KFDjSrGzc0Na9asweHDh+Ht7Q2VSoW0tDTce++9kMsbl+v279+P+++/H6+88gpiY2PF58PDw/Hkk0+iR48eiI6Oxueff47o6Gi89957191XYmIiDAaDuJ06dapRNdmSp9izZB2WjuRfwh/ZhXCRyzC6RyspSiMnN6ZHML6Pvwthvp7IKyrDAx/vxLLfjl33ZgIioubCtaFvmDlzJuLi4upsExYW1th60KNHD+j1ehgMBhiNRuh0OkRGRqJnz54AgICAABiNRhQWFlr1LuXn5yMgIMBqX3///TcGDRqEyZMn46WXXrrhsXv37i1e7quNUqmEUqm87uuOwDIxZck1cy1ZBnbfE+EHvxbuNd5HVB8RARqkPN0Xc777Ez/+mYv/W38Qu08U4O3RXeClUkhdHhGRTTQ4LOl0Ouh0OlvUYkWrrZos8ciRI9izZw/eeOMNAFVhys3NDZs3b8bo0aMBVN3Rlp2djaioKPH9Bw4cwD333IPx48dj3rx59TqmXq9HYKBzr5NW22K6xkoz1lSv+/UgF82lm6RWumLxQ93Qu6033vjxb/x8IB97TmzF3GEdMbxrEC/xElGz0+Cw1BDZ2dkoKChAdnY2TCYT9Ho9AKB9+/ZQq9UAqsYpzZ8/HyNHjgQAJCcnQ6fToXXr1vjrr7/w7LPPYsSIEeIlNK1Wi4kTJyIhIQHe3t7QaDR4+umnERUVJd4Jt3//ftxzzz0YPHgwEhISxLFMLi4uYtB7//330bZtW3Tq1AllZWVYtmwZUlNT8csvv9jylNicSlnzMtymg/koKDHCX6NE/9ttH3Sp+ZPJZHg8qg26BnvhueR9OHK2GM9+rce3Gacxb0RntPZRSV0iEVGTsWlYmjt3LlasWCE+7tatGwAgLS0NAwYMAFDVK2QwGMQ2ubm5SEhIQH5+PgIDA/H444/j5Zdfttrve++9B7lcjtGjR6O8vByDBw/Ghx9+KL7+7bff4ty5c1i1ahVWrVolPh8aGooTJ04AqJoDaubMmcjJyYFKpUKXLl2wadMmDBw4sKlPg1151rLkiWXR3DE9guHq4lBj+snJdQ3xwvpn7sbHW7OwOO0ofjtyHrHvb8Wzg27HpLvbwo3fNyJqBuwyz1Jz5WjzLAHA89/uwzd7TmPW4HDED2yP0xdLcfc7aRAEYOusAQj18ZS6RGqmjp0rxotr9yP92AUAQERAC8wf1RndWreUuDIiImtOPc8S3bwrPUtVl+G+zTgNQQCi2/kwKJFNhenU+PKJSCwY0wVeKjccyruEUR/twCs/7MelsgqpyyMiajSGpWbG03I3XLkJJrOA5D2nAQAPcGA32YFMJsPYniHYnNAfo7q1giAAK9JP4h/v/oqfDzjvuotEdGtjWGpmPK+6G27b0fPIKbwMrYcbBncKuME7iZqOj1qJdx+4E6smRiLUR4W8ojI8+d8MTF65B7mGy1KXR0TUIAxLzYyn5W44YyW+qR7YPbJbK7i7uUhZFt2i+t7mi5+n90P8wHZwlcvwy9/5+Me7v2L59uMwmTlckoicA8NSM2O5DHeq4DJ++bvqsse4nrwER9Jxd3PBrMER+PGZvuje2gvF5ZV4dd3fGPXRDvx9xrHWVyQiqg3DUjNj6Vn6K8eACpOALsFadAxyjDv16NYWEaDBt1Oi8caIO9BC6Yp9pwox7D/b8MaPf+M8F+YlIgfGsNTMWMYsWXBgNzkSuVyGx/qEYtPM/rj3jgCYzAI+23Ycd7+dhnnr/8a5SwxNROR4GJaaGcvacADg7ibHsK5BElZDVDt/jTs+erQHlk/oha7BWlyuMOHT347j7ndS8caPf+NsUZnUJRIRiRiWmhnLZTgAGNo5CBp3NwmrIarbgHA/fB9/F5Im9MKdIV4oqzBX9TS9k4ZXUw4gz8DQRETSY1hqZjyv6ll6sDcvwZHjk8lkGBjuh7VPRWPFv3qje2svlFeasXzHCfRbkIa5P+zndANEJCmbrg1H9hfk5YGoMB+0cHdFz1AuM0HOQyaTof/tOvS7zRfbj17AB5sPY/eJi1iZfhJf7zqFcb2CMXVAe7Ty8pC6VCK6xXBtuJvgiGvDETUXgiAgPesC3t98BLuOFwAA3FxkGNMjBE8NaIcQb5XEFRKRs2ro7zfD0k1gWCKyj53HLuCDTUfERXpd5TKM6RGMpwa0R2sfhiYiahiGJTtiWCKyr13HC/DB5sPYfrQqNLnIq8Y7jezWCoM6+HGmeiKqF4YlO2JYIpLGnhMF+GDzEfx25Lz4XAt3V9x3RyBGdm+F3m28IZfLJKyQiBwZw5IdMSwRSetw/iWs3ZuDH/bm4MxV0wy08vLA/XcGYWS3VrjNv4WEFRKRI2JYsiOGJSLHYDYL+P14Ab7fm4Of/srFpfJK8bU7Wmkw4s5WGH5nEPxauEtYJRE5CoYlO2JYInI8ZRUmbD54Fmv3nsaWzHOoNFf9X5xcBtx9mw4ju7VCbCd/q9nuiejWwrBkRwxLRI6toMSIH/88g7V7c7A3u1B8XqVwwZBOARjaJRA9Q72hVXGme6JbCcOSHTEsETmP4+dL8P3eHHyvz8HJC6VWr93ur0aPUG/0DG2Jnm1aorW3CjIZB4gTNVcMS3bEsETkfARBwB/Zhfh+bw62HT2P4+dLarTxVSvF4NQjtCU6BWmhcOXqUETNBcOSHTEsETm/88XlyDh5ERknL2LPiQLszymC0WS2aqN0laNriJcYoLq3bgkvlUKiionoZjEs2RHDElHzU1Zhwl85Buw5cREZJwuQcfIiLpZW1GjX3k+NNj6eCNS6I0DrDn+NOwI0VX8HaN2hVnIAOZGjYliyI4YlouZPEARknStBxsmC6gB1EcdquXR3LbXSFf4aZVV40nggQKtEgKYqVAVqPeDbQgG10hWeCldOoElkZwxLdsSwRHRrulBcjj9PG5BTeBn5RWXIM5Qh76r/vVRWeeOdXEWlcIGn0hUtlK7wVLrCU+lSFaSUrlBXb57Vm6WNi1wGmQyQAZDJZJDLUP246kmr53GlLa56LJddvY+qF8XncWV/lrHuYvtr9ln1nEw85rXvtX79+vXU9n7IUP3Zaq+pZi0yq5qIatPQ32/2ExMRNZCPWomBEX7Xfb2kvBJ5RWXIrw5PuYayGqHqQokRpuo5oEqNJpQaTTh3qdxeH+GWcsMgVkvYujpwWl6zhEXgmqB4zfvFY9Zn39fsA1e3q2s/dXymWsNqLfuvbR/VLWr/fLWE8avfV/Mz1tzP1Z+prvNoqRMAxvQIxh2ttDfzFbhpDEtERE3MU+mKdjo12unU120jCALKK80oLq9ESXklissrUVxWiRJjJYrLTVXPlVVav179d0m5CZVmMwQAggAIVTu86rEAsxnVj4Xq41U9b2kvCNf8fW0bofbnq/JdzfeazUJ1HTX3aRaufq3249rS1efoqmdte1BqMt1DWzIsERHdimQyGdzdXODu5gJftVLqciR3o/AGVIcu4UrMsQpbdQQxoTrB1Qx+V/Zd43nLfq32eU2YRO3vrxkEr9lHPWq7eh+ocdwb7P+afdSo7zr7v9Ku5n6swrhV/XUFcutzVPPfufq56xzH8tptftf/jw57YVgiIiLJWS4tVT+SshSiGjjLGhEREVEdGJaIiIiI6sCwRERERFQHhiUiIiKiOjAsEREREdWBYYmIiIioDjYNS/PmzUN0dDRUKhW8vLzq9Z78/HzExcUhKCgIKpUKQ4YMwZEjR6zalJWVIT4+Hj4+PlCr1Rg9ejTy8/Ot2lTdhmq9ff3111ZttmzZgu7du0OpVKJ9+/ZYvnz5zXxcIiIiaoZsGpaMRiPGjh2LqVOn1qu9IAgYMWIEjh07hh9++AF79+5FaGgoYmJiUFJyZeHKGTNmYN26dUhOTsbWrVtx5swZjBo1qsb+kpKSkJubK24jRowQXzt+/DiGDh2KgQMHQq/XY/r06Zg0aRJ+/vnnm/7cRERE1HzYZSHd5cuXY/r06SgsLKyz3eHDhxEeHo79+/ejU6dOAACz2YyAgAC8+eabmDRpEgwGA3Q6Hb788kuMGTMGAHDo0CF06NAB6enp6NOnD4CqnqW1a9daBaSrzZ49G+vXr8f+/fvF5x588EEUFhZiw4YN9fpcXEiXiIjI+TT099uhxiyVl1ctIunu7i4+J5fLoVQqsW3bNgBARkYGKioqEBMTI7aJiIhA69atkZ6ebrW/+Ph4+Pr6onfv3vj8889xdS5MT0+32gcADB48uMY+rq2vqKjIaiMiIqLmzaHCkiX0JCYm4uLFizAajXj77bdx+vRp5ObmAgDy8vKgUChqjIHy9/dHXl6e+Pj111/HN998g40bN2L06NF46qmnsHjxYvH1vLw8+Pv719hHUVERLl++XGt98+fPh1arFbeQkJAm+uRERETkqBoclubMmVPr4Omrt0OHDjWqGDc3N6xZswaHDx+Gt7c3VCoV0tLScO+990Iub1ipL7/8Mu666y5069YNs2fPxvPPP48FCxY0qi6LxMREGAwGcTt16tRN7Y+IiIgcX4MX0p05cybi4uLqbBMWFtbYetCjRw/o9XoYDAYYjUbodDpERkaiZ8+eAICAgAAYjUYUFhZa9S7l5+cjICDguvuNjIzEG2+8gfLyciiVSgQEBNS4gy4/Px8ajQYeHh617kOpVEKp5OrgREREt5IGhyWdTgedTmeLWqxotVoAwJEjR7Bnzx688cYbAKrClJubGzZv3ozRo0cDADIzM5GdnY2oqKjr7k+v16Nly5Zi2ImKisJPP/1k1Wbjxo117uNaljFQHLtERETkPCy/2/W+x02woZMnTwp79+4VXnvtNUGtVgt79+4V9u7dK1y6dElsEx4eLqxZs0Z8/M033whpaWlCVlaW8P333wuhoaHCqFGjrPY7ZcoUoXXr1kJqaqqwZ88eISoqSoiKihJfT0lJET799FPhr7/+Eo4cOSJ8+OGHgkqlEubOnSu2OXbsmKBSqYRZs2YJBw8eFJYsWSK4uLgIGzZsqPfnO3XqlACAGzdu3Lhx4+aE26lTp+r1e9/gnqWGmDt3LlasWCE+7tatGwAgLS0NAwYMAFDVK2QwGMQ2ubm5SEhIQH5+PgIDA/H444/j5Zdfttrve++9B7lcjtGjR6O8vByDBw/Ghx9+KL7u5uaGJUuWYMaMGRAEAe3bt8e7776LJ554QmzTtm1brF+/HjNmzMAHH3yA4OBgLFu2DIMHD6735wsKCsKpU6fQokULyGSyBp2buhQVFSEkJASnTp3ilAQNwPPWODxvjcPz1nA8Z43D89Y4dZ03QRBw6dIlBAUF1WtfdplniRqG8zc1Ds9b4/C8NQ7PW8PxnDUOz1vjNOV5c6ipA4iIiIgcDcMSERERUR0YlhyQUqnEK6+8wmkKGojnrXF43hqH563heM4ah+etcZryvHHMEhEREVEd2LNEREREVAeGJSIiIqI6MCwRERER1YFhiYiIiKgODEsOaMmSJWjTpg3c3d0RGRmJXbt2SV2SQ3v11Vchk8mstoiICKnLcji//vorhg0bhqCgIMhkMnz//fdWrwuCgLlz5yIwMBAeHh6IiYnBkSNHpCnWQdzonMXFxdX47g0ZMkSaYh3I/Pnz0atXL7Ro0QJ+fn4YMWIEMjMzrdqUlZUhPj4ePj4+UKvVGD16dI3FzW8l9TlnAwYMqPF9mzJlikQVO4aPPvoIXbp0gUajgUajQVRUFP73v/+JrzfV94xhycGsXr0aCQkJeOWVV/DHH3+ga9euGDx4MM6ePSt1aQ6tU6dOyM3NFbdt27ZJXZLDKSkpQdeuXbFkyZJaX3/nnXfw73//G0uXLsXvv/8OT09PDB48GGVlZXau1HHc6JwBwJAhQ6y+e1999ZUdK3RMW7duRXx8PHbu3ImNGzeioqICsbGxKCkpEdvMmDED69atQ3JyMrZu3YozZ85g1KhRElYtrfqcMwB44oknrL5v77zzjkQVO4bg4GC89dZbyMjIwJ49e3DPPffg/vvvx4EDBwA04fes3qvGkl307t1biI+PFx+bTCYhKChImD9/voRVObZXXnlF6Nq1q9RlOBUAwtq1a8XHZrNZCAgIEBYsWCA+V1hYKCiVSuGrr76SoELHc+05EwRBGD9+vHD//fdLUo8zOXv2rABA2Lp1qyAIVd8tNzc3ITk5WWxz8OBBAYCQnp4uVZkO5dpzJgiC0L9/f+HZZ5+Vrign0bJlS2HZsmVN+j1jz5IDMRqNyMjIQExMjPicXC5HTEwM0tPTJazM8R05cgRBQUEICwvDI488guzsbKlLcirHjx9HXl6e1XdPq9UiMjKS370b2LJlC/z8/BAeHo6pU6fiwoULUpfkcCyLpXt7ewMAMjIyUFFRYfV9i4iIQOvWrfl9q3btObP44osv4OvrizvuuAOJiYkoLS2VojyHZDKZ8PXXX6OkpARRUVFN+j1zbepiqfHOnz8Pk8kEf39/q+f9/f1x6NAhiapyfJGRkVi+fDnCw8ORm5uL1157DXfffTf279+PFi1aSF2eU8jLywOAWr97lteopiFDhmDUqFFo27YtsrKy8MILL+Dee+9Feno6XFxcpC7PIZjNZkyfPh133XUX7rjjDgBV3zeFQgEvLy+rtvy+VantnAHAww8/jNDQUAQFBeHPP//E7NmzkZmZiTVr1khYrfT++usvREVFoaysDGq1GmvXrkXHjh2h1+ub7HvGsERO79577xX/7tKlCyIjIxEaGopvvvkGEydOlLAyau4efPBB8e/OnTujS5cuaNeuHbZs2YJBgwZJWJnjiI+Px/79+zmOsAGud84mT54s/t25c2cEBgZi0KBByMrKQrt27exdpsMIDw+HXq+HwWDAt99+i/Hjx2Pr1q1NegxehnMgvr6+cHFxqTFSPz8/HwEBARJV5Xy8vLxw++234+jRo1KX4jQs3y9+925OWFgYfH19+d2rNm3aNPz4449IS0tDcHCw+HxAQACMRiMKCwut2vP7dv1zVpvIyEgAuOW/bwqFAu3bt0ePHj0wf/58dO3aFR988EGTfs8YlhyIQqFAjx49sHnzZvE5s9mMzZs3IyoqSsLKnEtxcTGysrIQGBgodSlOo23btggICLD67hUVFeH333/nd68BTp8+jQsXLtzy3z1BEDBt2jSsXbsWqampaNu2rdXrPXr0gJubm9X3LTMzE9nZ2bfs9+1G56w2er0eAG7579u1zGYzysvLm/R7xstwDiYhIQHjx49Hz5490bt3b7z//vsoKSnBhAkTpC7NYT333HMYNmwYQkNDcebMGbzyyitwcXHBQw89JHVpDqW4uNjqv0CPHz8OvV4Pb29vtG7dGtOnT8f//d//4bbbbkPbtm3x8ssvIygoCCNGjJCuaInVdc68vb3x2muvYfTo0QgICEBWVhaef/55tG/fHoMHD5awaunFx8fjyy+/xA8//IAWLVqI40O0Wi08PDyg1WoxceJEJCQkwNvbGxqNBk8//TSioqLQp08fiauXxo3OWVZWFr788kvcd9998PHxwZ9//okZM2agX79+6NKli8TVSycxMRH33nsvWrdujUuXLuHLL7/Eli1b8PPPPzft96xpb9ijprB48WKhdevWgkKhEHr37i3s3LlT6pIc2gMPPCAEBgYKCoVCaNWqlfDAAw8IR48elbosh5OWliYAqLGNHz9eEISq6QNefvllwd/fX1AqlcKgQYOEzMxMaYuWWF3nrLS0VIiNjRV0Op3g5uYmhIaGCk888YSQl5cnddmSq+2cARCSkpLENpcvXxaeeuopoWXLloJKpRJGjhwp5ObmSle0xG50zrKzs4V+/foJ3t7eglKpFNq3by/MmjVLMBgM0hYusX/9619CaGiooFAoBJ1OJwwaNEj45ZdfxNeb6nsmEwRBuNlkR0RERNRcccwSERERUR0YloiIiIjqwLBEREREVAeGJSIiIqI6MCwRERER1YFhiYiIiKgODEtEREREdWBYIiIiIqoDwxIRERFRHRiWiIiIiOrAsERERERUB4YlIiIiojr8P5SY4YZ8FdJeAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f77ee5b7160>]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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vaSlpXHzzTczbdq0I8qnpKRw1113MXnyZN+2yy67jPDwcF5++WUApk2bxpdffsnnn39+wheiW0IisnWrqSVZu9bMYzRsmBkaPzIy0JGJSEOapFtzRUUFq1atYvr06b5tdrud0aNHs2zZsnqPcbvduFyuOtvCw8P54osvfOv//e9/GTNmDJdffjlLliwhNTWV3/3ud1x//fUNxuJ2u3HXaiVXXFzcmEsRkVaoRw8z2qyItD6NasOyb98+PB4PSYf15UtKSiInJ6feY8aMGcOsWbPYvHkzXq+XxYsX8+abb7J3715fmW3btvH000/Ts2dPPvjgA2666SZ+//vfM3fu3AZjmTlzJrGxsb4lLS2tMZciIiIiLUiTzyX02GOP0bNnT/r06YPT6WTKlClMmjQJu93/1F6vl8GDB/Pwww8zaNAgbrjhBq6//nqeeeaZBs87ffp0ioqKfMvu3bub+lJEREQkQBqVsCQmJuJwOMjNza2zPTc3l+Tk5HqPad++PW+//TalpaXs3LmTDRs2EBUVRffu3X1lOnbsSL9+/eoc17dvX3bt2tVgLGFhYcTExNRZREREpHVqVMLidDoZMmQImZmZvm1er5fMzExGjBhx1GNdLhepqalUVVWxYMECxo0b59s3atQoNm7cWKf8pk2b6BKsE4qIiIhIs2p0t+apU6cyceJEhg4dyvDhw5k9ezalpaVMmjQJgAkTJpCamsrMmTMBWL58OVlZWQwcOJCsrCzuu+8+vF4vd9xxh++ct912GyNHjuThhx/miiuuYMWKFfzzn//kn//850m6TBEREWnJGp2wjB8/nvz8fO69915ycnIYOHAgixYt8jXE3bVrV532KeXl5dx9991s27aNqKgoLrzwQubNm0dcrfGthw0bxltvvcX06dN54IEH6NatG7Nnz+aqq6768VcoIiIiLZ6G5hcREZGAadKh+UVERESakxIWERERCXpKWERERCToKWERERGRoKeERURERIKeEhYREREJekpYREREJOgpYREREZGgp4RFREREgp4SFhEREQl6SlhEREQk6ClhERERkaCnhEVERESCnhIWERERCXpKWERERCToKWERERGRoKeERURERIKeEhYREREJekpYREREJOgpYREREZGgp4RFREREgp4SFhEREQl6SlhEREQk6ClhERERkaCnhEVERESCnhIWERERCXpKWERERCToKWERERGRoKeERURERIKeEhYREREJekpYREREJOgpYREREZGgp4RFREREgp4SFhEREQl6SlhEREQk6ClhERERkaCnhEVERESCnhIWERERCXpKWERERCToKWERERGRoKeERURERIKeEhYREREJekpYREREJOgpYREREZGgp4RFREREgp4SFhEREQl6SlhEREQk6ClhERERkaCnhEVERESCnhIWERERCXpKWERERCToKWERERGRoHdCCcuTTz5J165dcblcZGRksGLFigbLVlZW8sADD9CjRw9cLhfp6eksWrSowfKPPPIINpuNW2+99URCExERkVao0QnL/PnzmTp1KjNmzGD16tWkp6czZswY8vLy6i1/9913M2fOHB5//HF++OEHbrzxRn7+85+zZs2aI8quXLmSOXPmMGDAgMZfiYiIiLRajU5YZs2axfXXX8+kSZPo168fzzzzDBERETz//PP1lp83bx5/+tOfuPDCC+nevTs33XQTF154IX//+9/rlCspKeGqq67i2WefpV27did2NSIiItIqNSphqaioYNWqVYwePdp/Arud0aNHs2zZsnqPcbvduFyuOtvCw8P54osv6mybPHkyF110UZ1zH43b7aa4uLjOIiIiIq1ToxKWffv24fF4SEpKqrM9KSmJnJyceo8ZM2YMs2bNYvPmzXi9XhYvXsybb77J3r17fWVee+01Vq9ezcyZM487lpkzZxIbG+tb0tLSGnMpIiIi0oI0eS+hxx57jJ49e9KnTx+cTidTpkxh0qRJ2O3mqXfv3s0tt9zCK6+8ckRNzNFMnz6doqIi37J79+6mugQREREJsEYlLImJiTgcDnJzc+tsz83NJTk5ud5j2rdvz9tvv01paSk7d+5kw4YNREVF0b17dwBWrVpFXl4egwcPJiQkhJCQEJYsWcI//vEPQkJC8Hg89Z43LCyMmJiYOouIiIi0To1KWJxOJ0OGDCEzM9O3zev1kpmZyYgRI456rMvlIjU1laqqKhYsWMC4ceMAOPfcc1m3bh1r1671LUOHDuWqq65i7dq1OByOE7gsERERaU1CGnvA1KlTmThxIkOHDmX48OHMnj2b0tJSJk2aBMCECRNITU31tUdZvnw5WVlZDBw4kKysLO677z68Xi933HEHANHR0Zx22ml1niMyMpKEhIQjtouIiEjb1OiEZfz48eTn53PvvfeSk5PDwIEDWbRoka8h7q5du3ztUwDKy8u5++672bZtG1FRUVx44YXMmzePuLi4k3YRIiIi0rrZLMuyAh3EyVBcXExsbCxFRUVqzyIiItJCHO/nt+YSEhERkaCnhEVERESCnhIWERERCXpKWERERCToKWERERGRoKeERURERIKeEhYREREJekpYREREJOgpYREREZGgp4RFREREgp4SFhEREQl6SlhEREQk6ClhERERkaCnhEVERESCnhIWERERCXpKWERERCToKWERERGRoKeERURERIKeEhYREREJekpYREREJOgpYREREZGgp4RFREREgp4SFhEREQl6SlhEREQk6ClhERERkaCnhEVERESCnhIWERERCXpKWERERCToKWERERGRoKeERURERIKeEhYREREJekpYREREJOgpYREREZGgp4RFREREgp4SFhEREQl6SlhEREQk6ClhERERkaCnhEVERESCnhIWERERCXpKWERERCToKWERERGRoKeERURERIKeEhYREREJekpYREREJOgpYREREZGgp4RFREREgp4SFhEREQl6SlhEREQk6ClhERERkaCnhEVERESCnhIWERERCXonlLA8+eSTdO3aFZfLRUZGBitWrGiwbGVlJQ888AA9evTA5XKRnp7OokWL6pSZOXMmw4YNIzo6mg4dOnDppZeycePGEwlNREREWqFGJyzz589n6tSpzJgxg9WrV5Oens6YMWPIy8urt/zdd9/NnDlzePzxx/nhhx+48cYb+fnPf86aNWt8ZZYsWcLkyZP56quvWLx4MZWVlZx//vmUlpae+JWdLNs/x8r9PtBRiIiItGk2y7KsxhyQkZHBsGHDeOKJJwDwer2kpaVx8803M23atCPKp6SkcNdddzF58mTftssuu4zw8HBefvnlep8jPz+fDh06sGTJEs4888zjiqu4uJjY2FiKioqIiYlpzCU1zOuFJ4byXcd12CI7kNr5j8T2vRmbw3Fyzi8iItLGHe/nd6NqWCoqKli1ahWjR4/2n8BuZ/To0SxbtqzeY9xuNy6Xq8628PBwvvjiiwafp6ioCID4+PjGhHfyuYtwJ3dhX2IV+RHZrN13G6s+jCFn6XV4y/cHNjYREZE2pFEJy759+/B4PCQlJdXZnpSURE5OTr3HjBkzhlmzZrF582a8Xi+LFy/m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vPMOL7/8Ml6vl5EjR7Jnz55mjLbxMjIyePHFF1m0aBFPP/0027dv54wzzuDgwYP1lm8tr+vbb79NYWEh11xzTYNlWuprWp+a16cxr92J/N0Ho/Lycu68807+7//+76iT4zX2byFYXHDBBbz00ktkZmbyl7/8hSVLljB27Fg8Hk+95VvL6wowd+5coqOj+cUvfnHUci31tT1RrWa2ZmmcyZMn89133x3zfueIESMYMWKEb33kyJH07duXOXPm8OCDDzZ1mCds7NixvscDBgwgIyODLl268Prrrx/Xt5aW6rnnnmPs2LGkpKQ0WKalvqbiV1lZyRVXXIFlWTz99NNHLdtS/xauvPJK3+P+/fszYMAAevTowaeffsq5554bwMia3vPPP89VV111zMbwLfW1PVFtuoYlMTERh8NBbm5une25ubkkJyfXe0xycnKjygejKVOm8O677/LJJ5/QqVOnRh0bGhrKoEGD2LJlSxNF1zTi4uLo1atXg3G3htd1586dfPTRR1x33XWNOq6lvqaA7/VpzGt3In/3waQmWdm5cyeLFy8+au1KfY71txCsunfvTmJiYoNxt/TXtcbnn3/Oxo0bG/13DC33tT1ebTphcTqdDBkyhMzMTN82r9dLZmZmnW+gtY0YMaJOeYDFixc3WD6YWJbFlClTeOutt/j444/p1q1bo8/h8XhYt24dHTt2bIIIm05JSQlbt25tMO6W/LrWeOGFF+jQoQMXXXRRo45rqa8pQLdu3UhOTq7z2hUXF7N8+fIGX7sT+bsPFjXJyubNm/noo49ISEho9DmO9bcQrPbs2UNBQUGDcbfk17W25557jiFDhpCent7oY1vqa3vcAt3qN9Bee+01KywszHrxxRetH374wbrhhhusuLg4Kycnx7Isy7r66qutadOm+cp/+eWXVkhIiPXoo49a69evt2bMmGGFhoZa69atC9QlHLebbrrJio2NtT799FNr7969vuXQoUO+Modf7/3332998MEH1tatW61Vq1ZZV155peVyuazvv/8+EJdw3P7whz9Yn376qbV9+3bryy+/tEaPHm0lJiZaeXl5lmW1rtfVskxviM6dO1t33nnnEfta+mt68OBBa82aNdaaNWsswJo1a5a1Zs0aX8+YRx55xIqLi7Peeecd69tvv7XGjRtndevWzSorK/Od46c//an1+OOP+9aP9XcfKEe71oqKCuuSSy6xOnXqZK1du7bO37Db7fad4/BrPdbfQqAc7VoPHjxo3X777dayZcus7du3Wx999JE1ePBgq2fPnlZ5ebnvHC3ldbWsY7+PLcuyioqKrIiICOvpp5+u9xwt5bVtKm0+YbEsy3r88cetzp07W06n0xo+fLj11Vdf+fadddZZ1sSJE+uUf/31161evXpZTqfTOvXUU62FCxc2c8QnBqh3eeGFF3xlDr/eW2+91fe7SUpKsi688EJr9erVzR98I40fP97q2LGj5XQ6rdTUVGv8+PHWli1bfPtb0+tqWZb1wQcfWIC1cePGI/a19Nf0k08+qfd9W3NNXq/Xuueee6ykpCQrLCzMOvfcc4/4PXTp0sWaMWNGnW1H+7sPlKNd6/bt2xv8G/7kk0985zj8Wo/1txAoR7vWQ4cOWeeff77Vvn17KzQ01OrSpYt1/fXXH5F4tJTX1bKO/T62LMuaM2eOFR4ebhUWFtZ7jpby2jYVm2VZVpNW4YiIiIj8SG26DYuIiIi0DEpYREREJOgpYREREZGgp4RFREREgp4SFhEREQl6SlhEREQk6ClhERERkaCnhEVERESCnhIWERERCXpKWERERCToKWERERGRoKeERURERILe/wekZ6Xg1zQXJQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import time\n",
    "\n",
    "n_horizon=20\n",
    "dt=1.0\n",
    "pc_size=32\n",
    "state_size=2\n",
    "input_size=2\n",
    "\n",
    "\n",
    "A=torch.eye(2)\n",
    "B=torch.eye(2)\n",
    "\n",
    "A_ext=A\n",
    "for i in range(1,n_horizon):\n",
    "    A_ext=torch.vstack([A_ext,torch.matrix_power(A,i+1)])\n",
    "\n",
    "B_ext=torch.zeros([2*n_horizon,2*n_horizon])  \n",
    "for r in range(n_horizon):\n",
    "    for c in range(n_horizon):\n",
    "        if r>=c:\n",
    "            B_ext[2*r:2*r+2,2*c:2*c+2]=torch.matrix_power(A,r-c)@B\n",
    "B_ext=B_ext*dt  \n",
    "\n",
    "\n",
    "#initialization\n",
    "u=torch.zeros([2*n_horizon,1],requires_grad=True)\n",
    "x0=torch.zeros([2,1])\n",
    "\n",
    "p=torch.zeros([3,n_horizon])\n",
    "p[0,:]=torch.arange(n_horizon)*0.1\n",
    "p[1,:]=torch.arange(n_horizon)*0.1\n",
    "p[2,:]=torch.arange(n_horizon)*0.1\n",
    "\n",
    "pc_W=torch.rand([3,pc_size])*3+torch.tensor([1.,5.,-3.]).repeat([pc_size,1]).T\n",
    "ud=td.Uniform(-3,3)\n",
    "pc_W[0,:]=3.3\n",
    "pc_W[1,:]=ud.sample([1,pc_size])\n",
    "pc_W[2,:]=ud.sample([1,pc_size])\n",
    "\n",
    "#process agent\n",
    "\n",
    "def step(A,B,x0,u,p,pc_W,n_horizon):\n",
    "    state_size=x0.shape[0]\n",
    "    input_size=u.shape[0]\n",
    "    \n",
    "    x_flatten=A@x0+B@u\n",
    "    \n",
    "    #process agent \n",
    "    x=x_flatten.reshape([n_horizon,state_size]).T\n",
    "    agent_euler_zyx=torch.zeros([3,n_horizon])\n",
    "    agent_euler_zyx[:2,:]=x\n",
    "    \n",
    "    agent_pos=p\n",
    "\n",
    "    T_C_W=euler_position_to_T(euler_zyx=agent_euler_zyx,pos=agent_pos)\n",
    "    T_W_C=torch.inverse(T_C_W)\n",
    "    \n",
    "    \n",
    "    #process pc\n",
    "    pc_C=pc_W_to_C(pc_W,T_W_C)\n",
    "    pc_C_center=torch.mean(pc_C,axis=2)\n",
    "    \n",
    "    \n",
    "    pc_norm=torch.sqrt(torch.sum(pc_C**2,axis=1)).reshape([n_horizon,1,pc_size])\n",
    "    pc_normalized=pc_C/pc_norm\n",
    "    cos_bear=pc_normalized[:,0,:]\n",
    "    bear=torch.acos(cos_bear)\n",
    "    \n",
    "    #calculate loss\n",
    "    vis_pc=calculate_visibility(a=torch.tensor(1.0),fov=torch.pi*1,bearing=bear)\n",
    "    vis_ob=calculate_visibility(a=torch.tensor(10.),fov=torch.pi/2,bearing=bear[:,0])\n",
    "    \n",
    "    v_flatten=u\n",
    "    v=v_flatten.reshape([n_horizon,2]).T\n",
    "    a=v[:,1:]-v[:,:-1]\n",
    "    \n",
    "    \n",
    "    loss=-torch.mean(vis_pc)*1.-torch.mean(vis_ob)*1.#+torch.mean(a*a)*1e4+torch.mean(v*v)\n",
    "    \n",
    "    return loss,vis_pc,vis_ob\n",
    "\n",
    "\n",
    "t0=time.time()\n",
    "\n",
    "T_C_W=euler_position_to_T(euler_zyx=torch.zeros([3,n_horizon]),pos=p)\n",
    "T_W_C=torch.inverse(T_C_W)\n",
    "pc_C=pc_W_to_C(pc_W,T_W_C)\n",
    "print(T_W_C.dtype)\n",
    "print(pc_W.dtype)\n",
    "pc_C_center=torch.mean(pc_C,axis=2).T\n",
    "ob_C=pc_C[:,:,0].T\n",
    "\n",
    "x_init=vectors_to_euler_zy(v=ob_C)\n",
    "x_init=vectors_to_euler_zy(v=pc_C_center)\n",
    "\n",
    "\n",
    "x_init_flatten=x_init.T.reshape([2*n_horizon,1])\n",
    "u_init=torch.pinverse(B_ext)@(x_init_flatten-A_ext@x0)\n",
    "u=u_init\n",
    "u.requires_grad=True\n",
    "\n",
    "optimizer = optim.Adam([u], lr=0.01)\n",
    "\n",
    "loss_list=[]\n",
    "s_list=[]\n",
    "loss=torch.tensor(0.0)\n",
    "\n",
    "\n",
    "\n",
    "for i in range(30):\n",
    "    \n",
    "    loss_prev=loss\n",
    "    optimizer.zero_grad()  # 梯度清零\n",
    "    loss,vis_pc,vis_ob= step(A=A_ext,B=B_ext,x0=x0,u=u,p=p,pc_W=pc_W,n_horizon=n_horizon)\n",
    "    \n",
    "    if i==0:\n",
    "        vis_ob_init=vis_ob\n",
    "        vis_pc_init=vis_pc\n",
    "        print(loss)\n",
    "    \n",
    "    \n",
    "    loss.backward()  # 反向传播计算梯度\n",
    "    #print(loss)\n",
    "    loss_list.append(loss.item())\n",
    "    optimizer.step()\n",
    "    \n",
    "\n",
    "    \n",
    "    if torch.abs(loss_prev-loss)<1e-3:\n",
    "        optimizer = optim.Adam([u], lr=0.001)\n",
    "        \n",
    "    if torch.abs(loss_prev-loss)<1e-4:\n",
    "        optimizer = optim.Adam([u], lr=0.0001)\n",
    "\n",
    "print(time.time()-t0)\n",
    "\n",
    "plt.plot(loss_list)\n",
    "plt.show()\n",
    "plt.plot(vis_ob.detach().numpy())\n",
    "plt.plot(torch.mean(vis_pc,axis=1).detach().numpy())\n",
    "\n",
    "plt.plot(vis_ob_init.detach().numpy(),linestyle='--',color='b')\n",
    "plt.plot(torch.mean(vis_pc_init,axis=1).detach().numpy(),linestyle='--',color='y')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f77d5739880>,\n",
       " <matplotlib.lines.Line2D at 0x7f77d57398b0>]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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smXL6qjSOzdnzhz69OmDr68vISEhTJkyhRMnTtz0nA8//BCTyVTlx8PDo44qvju///3vr6m9ffv2Nz2nIX6uALGxsdfcq8lk4umnn77u8Q3pc/3uu++YOHEiERERmEwmFi1aVGW/YRi88MILhIeH4+npyciRIzl16tQtr1vd73xdudn9lpWV8etf/5ouXbrg7e1NREQEjz32GCkpKTe95p18F+rCrT7bH//4x9fUPXbs2Ftetz5+tre61+t9f00mE6+++uoNr1lfP9fapPBylS+//JJZs2bx4osvsnfvXrp168aYMWNIT0+/7vFbt27lwQcfZObMmezbt48pU6YwZcoUDh8+XMeVV8/GjRt5+umn2b59O6tXr6asrIzRo0dTUFBw0/P8/Py4ePGi4ycxMbGOKr57nTp1qlL75s2bb3hsQ/1cAXbt2lXlPlevXg3AD3/4wxue01A+14KCArp168Y777xz3f1//vOfefPNN5k7dy47duzA29ubMWPGUFxcfMNrVvc7X5dudr+FhYXs3buX3/3ud+zdu5evv/6aEydOMGnSpFtetzrfhbpyq88WYOzYsVXq/vzzz296zfr62d7qXq++x4sXLzJv3jxMJhP33XffTa9bHz/XWmWIQ9++fY2nn37a8dpqtRoRERHGnDlzrnv8/fffb9x7771VtsXHxxtPPPFErdZZ09LT0w3A2Lhx4w2P+eCDDwx/f/+6K6oGvfjii0a3bt1u+/jG8rkahmH8/Oc/N1q1amXYbLbr7m+onytgLFy40PHaZrMZYWFhxquvvurYlp2dbbi7uxuff/75Da9T3e+8s3z/fq9n586dBmAkJibe8Jjqfhec4Xr3On36dGPy5MnVuk5D+Gxv53OdPHmyMXz48Jse0xA+15qmlpcKpaWl7Nmzh5EjRzq2mc1mRo4cybZt2657zrZt26ocDzBmzJgbHl9f5eTkABAYGHjT4/Lz84mJiSE6OprJkydz5MiRuiivRpw6dYqIiAhatmzJww8/zPnz5294bGP5XEtLS/nkk094/PHHb7pIaUP+XK9ISEggNTW1yufm7+9PfHz8DT+3O/nO12c5OTmYTCYCAgJuelx1vgv1yYYNGwgJCaFdu3Y89dRTXLp06YbHNpbPNi0tjW+//ZaZM2fe8tiG+rneKYWXCpmZmVitVkJDQ6tsDw0NJTU19brnpKamVuv4+shms/Hcc88xcOBAOnfufMPj2rVrx7x581i8eDGffPIJNpuNAQMGcOHChTqs9s7Ex8fz4YcfsmLFCt59910SEhIYPHgweXl51z2+MXyuAIsWLSI7O5sf//jHNzymIX+uV7vy2VTnc7uT73x9VVxczK9//WsefPDBmy7cV93vQn0xduxY5s+fz9q1a3nllVfYuHEj48aNw2q1Xvf4xvLZfvTRR/j6+jJt2rSbHtdQP9e70ehWlZbqefrppzl8+PAtn4/279+f/v37O14PGDCADh068N577/GHP/yhtsu8K+PGjXP8uWvXrsTHxxMTE8NXX311W/9H01C9//77jBs3joiIiBse05A/V7ErKyvj/vvvxzAM3n333Zse21C/Cz/60Y8cf+7SpQtdu3alVatWbNiwgREjRjixsto1b948Hn744Vt2om+on+vdUMtLhaCgICwWC2lpaVW2p6WlERYWdt1zwsLCqnV8ffPMM8+wdOlS1q9fT1RUVLXOdXV1pUePHpw+fbqWqqs9AQEBtG3b9oa1N/TPFSAxMZE1a9bwk5/8pFrnNdTP9cpnU53P7U6+8/XNleCSmJjI6tWrb9rqcj23+i7UVy1btiQoKOiGdTeGz3bTpk2cOHGi2t9haLifa3UovFRwc3OjV69erF271rHNZrOxdu3aKv9nerX+/ftXOR5g9erVNzy+vjAMg2eeeYaFCxeybt064uLiqn0Nq9XKoUOHCA8Pr4UKa1d+fj5nzpy5Ye0N9XO92gcffEBISAj33ntvtc5rqJ9rXFwcYWFhVT633NxcduzYccPP7U6+8/XJleBy6tQp1qxZQ/Pmzat9jVt9F+qrCxcucOnSpRvW3dA/W7C3nPbq1Ytu3bpV+9yG+rlWi7N7DNcnX3zxheHu7m58+OGHxtGjR42f/exnRkBAgJGammoYhmE8+uijxvPPP+84fsuWLYaLi4vxl7/8xTh27Jjx4osvGq6ursahQ4ecdQu35amnnjL8/f2NDRs2GBcvXnT8FBYWOo75/r2+9NJLxsqVK40zZ84Ye/bsMX70ox8ZHh4expEjR5xxC9Xyy1/+0tiwYYORkJBgbNmyxRg5cqQRFBRkpKenG4bReD7XK6xWq9GiRQvj17/+9TX7GvLnmpeXZ+zbt8/Yt2+fARh/+9vfjH379jlG1/zpT38yAgICjMWLFxsHDx40Jk+ebMTFxRlFRUWOawwfPtx46623HK9v9Z13ppvdb2lpqTFp0iQjKirK2L9/f5XvcUlJieMa37/fW30XnOVm95qXl2f86le/MrZt22YkJCQYa9asMXr27Gm0adPGKC4udlyjoXy2t/p7bBiGkZOTY3h5eRnvvvvuda/RUD7X2qTw8j1vvfWW0aJFC8PNzc3o27evsX37dse+oUOHGtOnT69y/FdffWW0bdvWcHNzMzp16mR8++23dVxx9QHX/fnggw8cx3z/Xp977jnHv5fQ0FBj/Pjxxt69e+u++DvwwAMPGOHh4Yabm5sRGRlpPPDAA8bp06cd+xvL53rFypUrDcA4ceLENfsa8ue6fv366/69vXI/NpvN+N3vfmeEhoYa7u7uxogRI675dxATE2O8+OKLVbbd7DvvTDe734SEhBt+j9evX++4xvfv91bfBWe52b0WFhYao0ePNoKDgw1XV1cjJibG+OlPf3pNCGkon+2t/h4bhmG89957hqenp5GdnX3dazSUz7U2mQzDMGq1aUdERESkBqnPi4iIiDQoCi8iIiLSoCi8iIiISIOi8CIiIiINisKLiIiINCgKLyIiItKgKLyIiIhIg6LwIiIiIg2KwouIiIg0KAovIiIi0qAovIiIiEiDovAiIiIiDcr/D/hNNSXvz1aAAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_flatten=A_ext@x0+B_ext@u\n",
    "x=x_flatten.reshape([n_horizon,2]).T\n",
    "plt.plot(x.detach().numpy().T)\n",
    "plt.plot(x_init.detach().numpy().T,linestyle='--')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "ename": "RuntimeError",
     "evalue": "a Tensor with 40 elements cannot be converted to Scalar",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mRuntimeError\u001b[0m                              Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[5], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m x_flatten\u001b[39m.\u001b[39;49mitem()\n",
      "\u001b[0;31mRuntimeError\u001b[0m: a Tensor with 40 elements cannot be converted to Scalar"
     ]
    }
   ],
   "source": [
    "x_flatten.item()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.66666667, 0.        , 0.        ],\n",
       "       [0.        , 0.66666667, 0.        ],\n",
       "       [0.        , 0.        , 0.66666667]])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from numpy.linalg import inv\n",
    "\n",
    "def kalman_filter(P,Q,S,F=np.eye(3)):\n",
    "    \n",
    "    P_next=inv(inv(F@P@F.T+Q)+inv(S))\n",
    "\n",
    "    return P_next\n",
    "\n",
    "kalman_filter(np.eye(3),np.eye(3),np.eye(3),F=np.eye(3))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
